package com.itheima;

import com.itheima.dao.BookDao;
import com.itheima.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * alt + 7查看方法
 * ctrl + h查看实现方法
 *
 * bean的生命周期就是bean对象从创建到消亡的整个过程
 * bean的生命周期的控制就是在bean的创建和销毁时做一些事情
 * 比如初始化时加载一些文件之类的
 * 1.最直接的做法是在该对象的类中写一个init和destory方法，然后再配置文件<bean></bean>中配置bean时指定他两个
 *
 * 一般情况下只会执行init方法，因为销毁方法是在IOC容器关闭时才会执行，此时只有才java虚拟机退出时才会关闭IOC容器，
 * 此时才会执行destory方法，要想看到这个方法必须还是要实现IOC容器的关闭
 * 然而ApplicationContext接口中没有这个方法，所以此时调用 ClassPathXmlApplicationContext 接口
 *
 * IOC容器的执行流程为：
 * Java虚拟机启动  -> IOC容器加载 -> 配置类加载 -> bean对象的创建 -> 执行构造方法 -> 执行属性注入(set方法) -> 执行bean的初始化方法 -> 使用bean -> 销毁bean -> 关闭IOC容器 -> Java虚拟机退出
 *
 *
 * 关闭IOC容器的两种方法：
 * 1.使用ClassPathXmlApplicationContext接口，调用close方法
 * 2.设置关闭钩子方法       -->就是告诉虚拟机要等IOC容器关闭完了后再退出
 *
 * close是直接关闭容器，钩子是告诉虚拟机推出前要先关闭IOC容器
 *
 * 按Spring规范实现生命周期：
 * 在实现类上实现；两个接口 InitializingBean , DisposableBean
 */
public class AppForLifeCycle {

    public static void main(String[] args) {
//        ApplicationContext cx = new ClassPathXmlApplicationContext("applicationContext.xml");
        ClassPathXmlApplicationContext cx = new ClassPathXmlApplicationContext("applicationContext.xml");

        //注册关闭钩子即可
        cx.registerShutdownHook();

        BookDao bookDao = (BookDao) cx.getBean("bookDao");

        bookDao.save();

        //关闭IOC容器
//        cx.close();

        BookService bookService = (BookService) cx.getBean("bookService");
        bookService.save();
    }
}
